import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getTimeStamp, setTimeStamp } from '@/utils/auth'
import router from '@/router'
const TimeOut = 3600 // token过期时间//9·1
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

// request interceptor
// 请求拦截器， 现用于给请求添加 请求头授权配置
service.interceptors.request.use(config => {
  // 判断token是否过去，前提是有token
  if (store.getters.token) {
    // 判断时间戳函数返回的布尔值
    if (IsCheckTimeOut()) {
      store.dispatch('user/logout') // 登出操作
      router.push('/login')
      return Promise.reject(new Error('token超时'))
    }
    // 如果刷新页面了，就重新定义时间戳
    setTimeStamp()
    // 如果有登录，则加上请求头授权
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  return config
}, err => {
  return Promise.reject(err)
}
)

// response interceptor
// 响应拦截器 可以接受成功和错误两参数
service.interceptors.response.use(res => {
  // console.log(res)
  const { success, message, data } = res.data
  if (success) {
    // 若数据获取成功  返回token（数据里data表示token） 或其他的数据
    return data
  } else {
    // 数据失败
    Message.error(message)
    return Promise.reject(new Error(message))
    // 补充：promise是一种异步解决方案，接受resolve和reject两个参数，
    // 通过resolve完成对动作成功进行解析，reject会捕获这个动作的异常
    // resolve和reject是两个回调函数，调用resolve会触发then()，reject会触发catch
  }
}, err => {
  // 若网络错误
  console.dir(err)
  // 因网络错误的报错可能性很多 判断对不对↓
  // 防御性编程，如果response都没有，那data就会报错，为了防止报错
  if (err.response && err.response.data && err.response.data.code === 10002) {
    store.dispatch('user/logout') // 清数据
    router.push('/login')
  }
  Message.error(err.message)
  return Promise.reject(err)
})

// token过期时间戳函数
function IsCheckTimeOut() {
  const currentTime = Date.now() // 当前时间戳
  const timeStamp = getTimeStamp()
  return (currentTime - timeStamp) / 1000 > TimeOut
}

export default service
